function soupServings(n) {
  // 处理n=0的特殊情况，此时A和B都为0，概率为0.5
  if (n === 0) return 0.5;

  // 将n转换为以25毫升为单位的m，向上取整
  const m = Math.ceil(n / 25);

  // 当m足够大时（≥200），概率趋近于1.0
  if (m >= 200) return 1.0;

  // 创建dp数组，dp[i][j]表示当前A有i单位，B有j单位时的概率
  const dp = new Array(m + 1).fill(0).map(() => new Array(m + 1).fill(0));

  // 填充dp数组
  for (let i = 0; i <= m; i++) {
    for (let j = 0; j <= m; j++) {
      if (i === 0 && j === 0) {
        // A和B同时取完
        dp[i][j] = 0.5;
      } else if (i === 0) {
        // A先取完
        dp[i][j] = 1.0;
      } else if (j === 0) {
        // B先取完
        dp[i][j] = 0.0;
      } else {
        // 计算四种操作的概率和
        let sum = 0;

        // 操作1：A取100ml（4单位），B取0
        let a = i - 4,
          b = j;
        if (a <= 0 && b <= 0) sum += 0.5;
        else if (a <= 0) sum += 1.0;
        else if (b <= 0) sum += 0.0;
        else sum += dp[a][b];

        // 操作2：A取75ml（3单位），B取25ml（1单位）
        a = i - 3;
        b = j - 1;
        if (a <= 0 && b <= 0) sum += 0.5;
        else if (a <= 0) sum += 1.0;
        else if (b <= 0) sum += 0.0;
        else sum += dp[a][b];

        // 操作3：A取50ml（2单位），B取50ml（2单位）
        a = i - 2;
        b = j - 2;
        if (a <= 0 && b <= 0) sum += 0.5;
        else if (a <= 0) sum += 1.0;
        else if (b <= 0) sum += 0.0;
        else sum += dp[a][b];

        // 操作4：A取25ml（1单位），B取75ml（3单位）
        a = i - 1;
        b = j - 3;
        if (a <= 0 && b <= 0) sum += 0.5;
        else if (a <= 0) sum += 1.0;
        else if (b <= 0) sum += 0.0;
        else sum += dp[a][b];

        // 四种操作的平均概率
        dp[i][j] = 0.25 * sum;
      }
    }
  }

  // 返回初始状态n对应的概率
  return dp[m][m];
}
